quartz: implement maximized/unmaximized
authorChristoph Reiter <reiter.christoph@gmail.com>
Mon, 20 Jul 2015 07:05:52 +0000 (09:05 +0200)
committerChristoph Reiter <creiter@src.gnome.org>
Thu, 23 Jul 2015 11:19:09 +0000 (13:19 +0200)
Instead of using the default zoom behaviour use the internal
maximized state for selecting our own zoom target. This makes
zooming work for CSD windows where for some reason the
given default zoom target is the current window frame itself
resulting in a shadowless window of the same size.

While this makes the zoom button behave a bit different as expected
it makes things more consistent with other platforms and fixes CSD
zooming.

gdk/quartz/GdkQuartzNSWindow.c
gdk/quartz/GdkQuartzNSWindow.h
gdk/quartz/gdkwindow-quartz.c

index 8795d3d762d359b1e86d1fd256f703b055f1e6bf..c6dc77c29dabe8c3ae8d5551eacc67e638474fd3 100644 (file)
@@ -689,4 +689,43 @@ update_context_from_dragging_info (id <NSDraggingInfo> sender)
   return rect;
 }
 
+- (NSRect)windowWillUseStandardFrame:(NSWindow *)nsWindow
+                        defaultFrame:(NSRect)newFrame
+{
+  NSRect screenFrame = [[self screen] visibleFrame];
+  GdkWindow *window = [[self contentView] gdkWindow];
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
+  gboolean maximized = gdk_window_get_state (window) & GDK_WINDOW_STATE_MAXIMIZED;
+
+  if (!maximized)
+    return screenFrame;
+  else
+    return lastUnmaximizedFrame;
+}
+
+- (BOOL)windowShouldZoom:(NSWindow *)nsWindow
+                 toFrame:(NSRect)newFrame
+{
+
+  GdkWindow *window = [[self contentView] gdkWindow];
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
+  gboolean maximized = gdk_window_get_state (window) & GDK_WINDOW_STATE_MAXIMIZED;
+
+  if (maximized)
+    {
+      gdk_synthesize_window_state (window,
+                                   GDK_WINDOW_STATE_MAXIMIZED,
+                                   0);
+    }
+  else
+    {
+      lastUnmaximizedFrame = [nsWindow frame];
+      gdk_synthesize_window_state (window,
+                                   0,
+                                   GDK_WINDOW_STATE_MAXIMIZED);
+    }
+
+  return YES;
+}
+
 @end
index 540b965afb7951acd95dc24a57021c1907d09aa3..792ea24f48347af0dcf1bc53be71048f94f5d2c6 100644 (file)
@@ -32,6 +32,8 @@
   NSPoint initialMoveLocation;
   NSPoint initialResizeLocation;
   NSRect  initialResizeFrame;
+
+  NSRect  lastUnmaximizedFrame;
 }
 
 -(BOOL)isInMove;
index f05ab9469f62611f72004727f34310aee8d91958..7d6bfe4dad7f9f6c8596afc7b71b484a92b0c8d5 100644 (file)
@@ -2477,56 +2477,48 @@ static void
 gdk_quartz_window_maximize (GdkWindow *window)
 {
   GdkWindowImplQuartz *impl;
+  gboolean maximized;
 
   if (GDK_WINDOW_DESTROYED (window) ||
       !WINDOW_IS_TOPLEVEL (window))
     return;
 
   impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
+  maximized = gdk_window_get_state (window) & GDK_WINDOW_STATE_MAXIMIZED;
 
   if (GDK_WINDOW_IS_MAPPED (window))
     {
       GDK_QUARTZ_ALLOC_POOL;
 
-      if (impl->toplevel && ![impl->toplevel isZoomed])
-       [impl->toplevel zoom:nil];
+      if (impl->toplevel && !maximized)
+        [impl->toplevel zoom:nil];
 
       GDK_QUARTZ_RELEASE_POOL;
     }
-  else
-    {
-      gdk_synthesize_window_state (window,
-                                  0,
-                                  GDK_WINDOW_STATE_MAXIMIZED);
-    }
 }
 
 static void
 gdk_quartz_window_unmaximize (GdkWindow *window)
 {
   GdkWindowImplQuartz *impl;
+  gboolean maximized;
 
   if (GDK_WINDOW_DESTROYED (window) ||
       !WINDOW_IS_TOPLEVEL (window))
     return;
 
   impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
+  maximized = gdk_window_get_state (window) & GDK_WINDOW_STATE_MAXIMIZED;
 
   if (GDK_WINDOW_IS_MAPPED (window))
     {
       GDK_QUARTZ_ALLOC_POOL;
 
-      if (impl->toplevel && [impl->toplevel isZoomed])
-       [impl->toplevel zoom:nil];
+      if (impl->toplevel && maximized)
+        [impl->toplevel zoom:nil];
 
       GDK_QUARTZ_RELEASE_POOL;
     }
-  else
-    {
-      gdk_synthesize_window_state (window,
-                                  GDK_WINDOW_STATE_MAXIMIZED,
-                                  0);
-    }
 }
 
 static void